package cn.tedu.weibo.service.impl;

import cn.tedu.weibo.exception.ServiceException;
import cn.tedu.weibo.mapper.UserMapper;
import cn.tedu.weibo.pojo.dto.UserLoginDTO;
import cn.tedu.weibo.pojo.dto.UserRegDTO;
import cn.tedu.weibo.pojo.entity.User;
import cn.tedu.weibo.pojo.vo.UserVO;
import cn.tedu.weibo.response.JsonResult;
import cn.tedu.weibo.response.StatusCode;
import cn.tedu.weibo.service.UserService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Date;

/**业务层实现类需要添加@Service注解,表示其为业务层实现类*/
@Service
public class UserServiceImpl implements UserService {
    //业务层需要注入持久层对象
    @Autowired
    UserMapper userMapper;

    @Override
    public void reg(UserRegDTO userRegDTO) {
        //根据用户名查询用户是否存在
        UserVO userVO = userMapper.selectByUserName(userRegDTO.getUsername());
        //如果不为空,说明用户已存在
        if(userVO!=null){
            //主业务如果遇到了问题,需要抛出业务层异常,而不是直接给前端返回结果
            //Controller层才是给前端返回结果的那一层
            throw new ServiceException(StatusCode.USERNAME_ALREADY_EXISTS);
        }
        //如果为空,新增用户
        User user = new User();
        BeanUtils.copyProperties(userRegDTO,user);
        user.setCreated(new Date());
        userMapper.insert(user);
    }
    @Override
    public UserVO login(UserLoginDTO userLoginDTO) {
        //1.通过前端传过来的用户名查询该用户的信息存入userVO中
        UserVO userVO = userMapper.selectByUserName(userLoginDTO.getUsername());
        //2.如果没有查到用户信息,抛出业务层异常:用户名错误
        if(userVO==null){
            throw new ServiceException(StatusCode.USERNAME_ERROR);
        }
        //3.如果根据用户名查出的数据库密码与用户输入的密码不一致
        if(!userVO.getPassword().equals(userLoginDTO.getPassword())){
            //抛出业务层异常:密码错误
            throw new ServiceException(StatusCode.PASSWORD_ERROR);
        }
        //4.如果以上两个异常都没有遇到,说明登录成功,没有异常就是成功,不需要特殊处理
        //5.返回userVO,这样前端可以拿到登录的用户数据
        return userVO;
    }
}
